// 除非遵守许可证，否则不得使用此文件。
// 您可以通过
// 
// www.apache.org/licenses/LICENSE-2.0 
// 
// 除非适用法律要求或书面同意，否则根据许可证分发的软件
// 按“原样”分发，
// 无任何明示或暗示的保证或条件。
// 请参阅许可证，了解管理许可的特定语言和
// 许可证下的限制。

package transport

import (
	"syscall"
)

type Controls []func(network, addr string, conn syscall.RawConn) error

func (ctls Controls) Control(network, addr string, conn syscall.RawConn) error {
	for _, s := range ctls {
		if err := s(network, addr, conn); err != nil {
			return err
		}
	}
	return nil
}

type SocketOpts struct {
	// ReusePort启用套接字选项，因此_ReusePort[1]允许重新绑定
	// 已在使用的端口。用户应记住，flock可能会失败
	// 在这种情况下，锁定数据文件可能会导致意外的
	// 情况。用户应注意防止锁竞争。
	// /[1]https:
	ReusePort bool `json:"reuse-port"`
	// /ReuseAddress启用了一个套接字选项，因此REUSEADDR允许
	// /绑定到处于“TIME\u WAIT”状态的地址。有助于提高MTTR 
	// 在etcd因“等待时间”过长而重启缓慢的情况下。
	// /[1]https:
	ReuseAddress bool `json:"reuse-address"`
}

func getControls(sopts *SocketOpts) Controls {
	ctls := Controls{}
	if sopts.ReuseAddress {
		ctls = append(ctls, setReuseAddress)
	}
	if sopts.ReusePort {
		ctls = append(ctls, setReusePort)
	}
	return ctls
}

func (sopts *SocketOpts) Empty() bool {
	return !sopts.ReuseAddress && !sopts.ReusePort
}
